package com.aaa.sys.service.impl;

import com.aaa.common.entity.Dept;
import com.aaa.sys.dao.DeptDao;
import com.aaa.sys.service.DeptService;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 部门表(Dept)表服务实现类
 *
 * @author yuxiujie
 * @since 2021-01-23 09:58:32
 */
@Service("deptService")
public class DeptServiceImpl implements DeptService {

    @Resource
    private DeptDao deptDao;

    /**
     * 通过ID查询单条数据
     *
     * @param deptId 主键
     * @return 实例对象
     */
    @Override
    public Dept queryById(Integer deptId) {
        return this.deptDao.queryById(deptId);
    }

    /**
     * 查询多条数据
     *
     * @param offset 查询起始位置
     * @param limit  查询条数
     * @return 对象列表
     */
    @Override
    public List<Dept> queryAllByLimit(int offset, int limit) {
        return this.deptDao.queryAllByLimit(offset, limit);
    }

    /**
     * 新增数据
     *
     * @param dept 实例对象
     * @return 实例对象
     */
    @Override
    public Dept insert(Dept dept) {
        dept.setStatus("0");
        dept.setDelFlag("0");
        dept.setCreateBy("admin");
        dept.setCreateTime(new Date());
        this.deptDao.insert(dept);
        return dept;
    }

    /**
     * 修改数据
     *
     * @param dept 实例对象
     * @return 实例对象
     */
    @Override
    public Dept update(Dept dept) {
        dept.setUpdateBy("yxj");
        dept.setUpdateTime(new Date());
        this.deptDao.update(dept);
        return this.queryById(dept.getDeptId());
    }

    /**
     * 通过主键删除数据
     *
     * @param deptId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer deptId) {
        return this.deptDao.deleteById(deptId) > 0;
    }

    /**
     * 分页查询多条数据
     *
     * @param dept Dept
     * @return 对象列表
     */
    @Override
    public List<Dept> queryAll(Dept dept) {
        //查找到所有数据
        List<Dept> depts = this.deptDao.queryAll(dept);
        //定义一个新的集合，用于返回
        List<Dept> deptList = new ArrayList<>();
        //判断查找的数据是否为空
        if (!CollectionUtils.isEmpty(depts)) {
            //获取一级部门
            for (Dept dept1 : depts) {
                if (dept1.getParentId() == 0) {
                    dept1.setValue(dept1.getDeptId());
                    dept1.setLabel(dept1.getDeptName());
                    deptList.add(dept1);
                    //查找一级部门的孩子
                    bindChildren(dept1, depts);
                }
            }
        }
        return deptList;
    }

    /**
     * 功能描述:为了修改部门检查名称是否重复
     *
     * @param deptId   Integer
     * @param deptName String
     * @return java.util.List<com.aaa.common.entity.Role>
     */
    @Override
    public List<Dept> checkRoleName(Integer deptId, String deptName,Integer parentId) {
        return deptDao.checkRoleName(deptId, deptName,parentId);
    }

    /**
     * 功能描述:递归查询当前节点的子节点
     *
     * @param currentDept Dept 当前节点
     * @param depts       List<Dept> 全部节点
     * @return void
     */
    private void bindChildren(Dept currentDept, List<Dept> depts) {
        for (Dept dept : depts) {
            //判断循环节点的父节点ID是否和当前节点相等，如果相等，说明循环节点是当前节点的子节点
            if (dept.getParentId().equals(currentDept.getDeptId())) {
                //获取当前节点的所有孩子 如果是第一个孩子 获取集合为空
                List<Dept> children = currentDept.getChildren();
                if (children == null) {
                    children = new ArrayList<>();
                }
                dept.setValue(dept.getDeptId());
                dept.setLabel(dept.getDeptName());
                children.add(dept);
                //再次设置孩子集合
                currentDept.setChildren(children);
                //自己调自己，为当前循环节点继续找孩子
                bindChildren(dept, depts);
            }
        }
    }
}